<?php

class ClienteController extends Controller {
    /**
     * @final   pacote das views deste controller
     */
    const PACKAGE_VIEW = 'cliente';
    /**
     * @var ClienteService
     */
    private $clienteService;
    /**
     * @var PlanoService
     */
    private $planoService;
    /**
     * @var FinanceiroService
     */
    private $financeiroService;
    /**
     * @var AvaliacaoService
     */
    private $avaliacaoService;
    /**
     * @var ComunicadoService
     */
    private $comunicadoService;

    /**
     * __construct
     * Inicializa todos os servicos usuados por AdministracaoController
     */
    public function __construct() {
        $this->clienteService = ClienteService::getInstance();
        $this->planoService = PlanoService::getInstance();
        $this->financeiroService = FinanceiroService::getInstance();
        $this->avaliacaoService = AvaliacaoService::getInstance();
        $this->comunicadoService = ComunicadoService::getInstance();
    }

    public function inserir() {
        $ArDados = $_POST;
        $Form = Validator::inserirCliente($ArDados);
        if( !$Form->validate() ) {
            $this->saveReturn( $Form->getFirstError() );
        }

        if (!$this->hasReturn()) {
            $ArDados['Individual']['DtNascimento'] = dateBRtoBD($ArDados['Individual']['DtNascimento']);
            if (!empty($ArDados['Enterprise'])) {
                $ArDados['Enterprise']['DtFundacao'] = dateBRtoBD($ArDados['Enterprise']['DtFundacao']);
            }
            multipleEntities($ArDados);
            if ($this->clienteService->save($ArDados)) {
                $this->saveReturn('Cliente criado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao criar o cliente. Certifique-se que este cliente está com o CPF, Cnpj e o Email são únicos no sistema.');
            }
        }
        $this->showJsonResponse();
    }

    public function buscarCliente() {
        $StFeedback = treatUrl('feedback');
        if( !empty($StFeedback) ) {
            $StMessage = $StFeedback == 'cliente-nao-encontrado' ? 'A busca não retornou nenhum resultado.' : 'Parâmetros não foram passados corretamente.';
            $this->addFeedback($StMessage);
        }
        $ArCities = $this->clienteService->getListOfIdexedCity();
        $ArPlans = $this->planoService->findAll();
        $this->save(SESSION_INTERFACE, 'CityList', $ArCities);
        $this->save(SESSION_INTERFACE, 'PlanList', $ArPlans);
        $this->view('buscar_cliente', self::PACKAGE_VIEW);
    }

    public function resultadoBuscaCliente() {
        multipleEntities($_POST);

        if (empty($_POST['FilterType'])) {
            return redirect('cliente', 'buscar-cliente', 'feedback/parametros-invalidos');
        }

        $ArDados = $this->clienteService->generateSearchParameters($_POST);
        $ArSearch = $this->clienteService->searchCustomerByFilter($ArDados);

        if( empty($ArSearch) )  {
            return redirect('cliente', 'buscar-cliente', 'feedback/cliente-nao-encontrado');
        }

        $this->save(SESSION_INTERFACE, 'SearchResult', $ArSearch);
        $this->view('resultado_busca', self::PACKAGE_VIEW);
    }

    public function visualizarCliente() {
        $IDCliente = treatUrl('id');
        multipleEntities($IDCliente);

        if (empty($IDCliente)) {
            return redirect('cliente', 'buscar-cliente');
        }

        $this->save(SESSION_INTERFACE, 'Customer', $this->clienteService->findById($IDCliente));
        $this->view('visualizar_cliente', self::PACKAGE_VIEW);
    }

    /* vinicius */

    public function editarCliente() {
        $IDCliente = treatUrl('id');
        multipleEntities($IDCliente);
        $this->save(SESSION_INTERFACE, 'Customer', $this->clienteService->findById($IDCliente));
        $this->view('editar', self::PACKAGE_VIEW);
    }

    public function atualizarCliente() {
        $ArDados = $_POST;

        $Form = Validator::editarCliente($ArDados);
        if( !$Form->validate() ) {
            $this->saveReturn( $Form->getFirstError() );
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);
            $ArDados['Individual']['DtNascimento']=dateBRtoBD($ArDados['Individual']['DtNascimento']);
            if ($this->clienteService->update($ArDados)) {
                $this->saveReturn('Dados atualizados com sucesso!', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao atualizar cliente');
            }
        }
        $this->showJsonResponse();
    }

    /* richard */

    public function historicoFinanceiro() {
        $IDFinanceiro = treatUrl('id');
        $this->save(SESSION_INTERFACE, 'CustomerReport', $this->financeiroService->generateFinancialHistoryReport($IDFinanceiro));
        $this->view('historico_financeiro', self::PACKAGE_VIEW);
    }

    public function relatorioFinanceiro() {
        $IDFinanceiro = treatUrl('id');
        $this->save(SESSION_INTERFACE, 'PaymentFinancialReport', $this->clienteService->generatePaymentFinancialReport($IDFinanceiro));
        $this->save(SESSION_INTERFACE, 'PaymentTypeFinancialReport', $this->clienteService->generatePaymentTypeFinancialReport($IDFinanceiro));
        $this->save(SESSION_INTERFACE, 'HistoryFinancialReport', $this->clienteService->generateHistoryFinancialReport($IDFinanceiro));
        $this->view('relatorio_financeiro', self::PACKAGE_VIEW);
    }

    public function relatorioComunicados() {
        $this->save(SESSION_INTERFACE, 'AnnouncementReport', $this->comunicadoService->generateAnnouncementReport());
        $this->save(SESSION_INTERFACE, 'AnnouncementTypeReport', $this->comunicadoService->generateAnnouncementTypeReport());
        $this->view('relatorio_comunicados', self::PACKAGE_VIEW);
    }

    public function relatorioAtendimento() {
        $this->save(SESSION_INTERFACE, 'CustomerTreatmentReport', $this->clienteService->generateTreatmentReport());
        $this->view('relatorio_atendimento', self::PACKAGE_VIEW);
    }

    public function relatorioSatisfacao() {
        $this->save(SESSION_INTERFACE, 'SatisfactionReport', $this->clienteService->generateSatisfactionReport());
        $this->save(SESSION_INTERFACE, 'SatisfactionEvaluationsReport', $this->clienteService->generateSatisfactionEvaluationsReport());
        $this->save(SESSION_INTERFACE, 'EvaluationsNumberReport', $this->avaliacaoService->generateEvaluationsNumberReport());
        $this->view('relatorio_satisfacao', self::PACKAGE_VIEW);
    }

}

?>
